/**************************************************************************//**
 * @item     CosyOS-II Hook
 * @file     init_hook.c
 * @brief    初始化钩子
 * @detail   在主函数中首先被调用，适用于初始化时钟、GPIO、寄存器等工作。
 * @author   迟凯峰
 * @version  V3.0.0
 * @date     2024.06.25
 ******************************************************************************/

#include "..\System\os_link.h"
#include "..\User\nec.h"

#define BAUD 115200		// 声明串口波特率
#define TM2	(65536 - SYSCFG_SYSCLK / 4 / BAUD)	// 串口波特率发生器的定时器值

void initGPIO(void) {
    P0M1 = 0x30;   P0M0 = 0x30;   //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
    P1M0 = 0; P1M1 = 0;
    P2M0 = 0; P2M1 = 0;
    P3M0 = 0; P3M1 = 0;
    P4M0 = 0; P4M1 = 0;
    P5M0 = 0; P5M1 = 0;
    P6M1 = 0xff;   P6M0 = 0xff;   //设置为漏极开路(实验箱加了上拉电阻到3.3V)
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
}

void init_hook(void)
{
	initGPIO();
    
    AUXR  =        0x00;  // 允许访问内部xdata
	/*
	1000 0001
	B7:1:使能访问XFR
	B0:1:P46，P47 位串口二的 RX和TX
	*/
    P_SW2 =        EAXFR | 0x01; // 1000 0001  允许访问扩展RAM区特殊功能寄存器, 我是用的是STCH试验箱，因此这里需要切换串口二的引脚；
    
    TMOD = 0x00;   // 定时器0、1 为16位自动重装载模式
	
	/*
	0100 0101:
	B7：0：设置定时器0为系统时钟12分频；
	B6：1：设置定时器1为系统时钟，不分频；
	B2：1：设置定时器2为1T模式；
	B0：1：串口1使用定时器2作为波特率发生器；
	*/
    AUXR = 0x45;   // 0100 0101 定时器1、2为1T模式，  串口1用定时器2做波特率发生器
	/*
	0100 0000 
	B7-B6: 设置串口1为可变波特率8位数据模式
	B4：设置串口1禁止串口1接收；
	B1-B0：串口1的中断标志位
	*/
    SCON = 0x40;   // 串口1工作模式为模式1
	TI = 1;        // 用于printf
	
	/*
	1100 0000 
	B7-B6: 串口1切换至P4.3/P4.4
	*/
	P_SW1 = 0xC0; 
	
	/*
	串口2的设置：
	0100 0000
	B7：0：设置串口2为可变波特率8位数据模式；
	B1-B0：设置串口2中断标志位
	*/
    S2CON = 0x40;  // 串口2工作模式为模式0，串口2用定时器2做波特率发生器
    
    /* 定时器2 */
    T2L = (unsigned char)TM2;
    T2H = (unsigned char)(TM2 >> 8);
	
	/*
	0100 0101 | 0001 0000 = 0101 0101
	B4:1:定时器2的运行控制位，这里开启定时器2
	*/
    AUXR |= T2R;
    /* UART2中断优先级为1级 */
    IP2H &=~PS2H;
    IP2 |= PS2;
    /* INT0中断优先级为0级 */
    IPH &=~PX0H;
    PX0 = 0;
    /* 任务管理器 */
    #if SYSCFG_DEBUGGING == 1
    S2CON |= S2REN;
    IE2 |= ES2;
    #endif
	
	sampleInit();
}
